<?php
namespace app\common\controller;

use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\Writer\PngWriter;

class QrCodeService
{
    /**
     * 生成二维码并保存到服务器
     * @param  string  $text  内容（网址/文本）
     * @param  int  $size  尺寸（像素）
     * @param  string  $filename
     * @param  string|null  $saveDir  保存目录（可选）
     * @return array ['url' => 访问URL, 'path' => 物理路径]
     */
    public static function saveQrCode(string $text, int $size = 300,string $saveDir,string $filename): array
    {
        // 1. 设置保存路径（FastAdmin默认上传目录）
        if (!is_dir($saveDir)) {
            mkdir($saveDir, 0755, true);
        }

        // 2. 生成唯一文件名
        $fullPath = $saveDir . $filename;

        // 3. 使用endroid库生成二维码
        $result = Builder::create()
            ->writer(new PngWriter())
            ->data($text)
            ->encoding(new Encoding('UTF-8'))
            ->size($size)
            ->margin(10)
            ->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
            ->build();

        // 4. 保存图片到服务器
        $result->saveToFile($fullPath);
        return [
            'url'  => $fullPath, // 可访问的URL
        ];
    }

    /**
     * 直接输出二维码到浏览器（不保存）
     * @param string $text 内容
     * @param int $size 尺寸
     */
    public static function outputQrCode(string $text, int $size = 300)
    {
        $qrCode = Builder::create()
            ->writer(new PngWriter())
            ->data($text)
            ->size($size)
            ->build();

        // 直接输出二进制流
        header('Content-Type: ' . $qrCode->getMimeType());
        echo $qrCode->getString();
        exit;
    }
}
